from chapter_indices import old_testament,new_testament


def chapter_generator(start=('创世记', 1), capacity=2):
    '''
    :param start: 从哪一篇的哪一章开始
    :param capacity: 每日读经的章数
    '''
    
    # 以下的chapter_full_title是dict的key
    chapter_full_title, chapter_index = start

    # 选择新约或旧约
    # 利用python中and和or的特性实现另类的三元表达式(and后必须是隐式True)
    bible_indices = old_testament.get(chapter_full_title) and old_testament or new_testament

    chapter_short_title, chapters_amount = bible_indices[chapter_full_title]
    if chapter_index > chapters_amount:
        return f'{chapter_full_title}总共{chapters_amount}章,你选择的第{chapter_index}章超出范围'

    # 储存每日读经的章节数
    chapter_dict = dict()
    index_list = []
    count = 0
    locate_start_point = 1
    while True:

        # 在整部旧约/新约中循环"卷"
        # 例如在新约, 从马太福音循环到启示录
        for chapter, num in bible_indices.values():

            # 在"卷"中循环"章"
            # 例如在马太福音, 从1章循环到28章
            for index in range(1, num+1, 1):

                # 之所以有locate_start_point是因为程序需要一个"起始章节"(循环起点).
                # 例如从马太福音第10章开始循环
                if locate_start_point:

                    # 如果当前"卷"不匹配给定值, 终止当前循环, 继续匹配下一卷
                    # 例如给定值是"马太福音", 当前"卷"不是"马太福音"直接终止"章"的循环
                    if chapter != chapter_short_title:
                        break

                    # "卷"匹配后, 继续判断当前"章"是否匹配给定值.
                    # 如果匹配, 则确定循环起点, 程序向前执行
                    elif index == chapter_index:
                        locate_start_point = 0
                    else:
                        continue
                
                index_list.append(index)

                # 定义count变量而不是len(index_list), 是因为很有可能产生多个index_list
                count += 1
                if count == capacity:
                    chapter_dict[chapter] = index_list.copy()
                    yield __fmt_to_str__(chapter_dict)
                    index_list.clear()
                    chapter_dict.clear()
                    count = 0
            
            # "卷"的"章"尽数录入index_list, 但是还没有达到capacity
            # 如果不提交, 这一卷的章会被录入到下一卷中
            # 例如, 期待chapter_dict = {'太':[26,27,28], '可':[1,2]}
            # 结果是chapter_dict = {'可':[26,27,28,1,2]}
            if index_list:
                chapter_dict[chapter] = index_list.copy()
                index_list.clear()


def __fmt_to_str__(chapter_dict):
    return ', '.join(f'{k}{v[0]}-{v[-1]}' if len(v) > 1 else f'{k}{v[0]}' for k, v in chapter_dict.items())


if __name__ == '__main__':
    # 这种在整部新约/旧约循环的方法有一个缺点
    # 如果每天的读经数过多, 直接导致类似死循环的内存压力
    # 不过GUI设定的capacity最多为9
    c1 = chapter_generator(start=('加拉太书', 1), capacity=9)
    c2 = chapter_generator(start=('但以理书', 3), capacity=1)
    dj1 = [next(c1) for _temp in range(7)]
    dj2 = [next(c2) for _temp in range(7)]
    print(dj1)
    print(dj2)
